import { generateReqKey } from './commonFuns';
import type { AxiosCustomRequestConfig, AxiosCustomError } from './type';
import type { AxiosResponse } from 'axios';
import { cloneDeep } from 'lodash-es';
import AbortAxios from './AbortAxios';

//定义缓存对象
const cacheMap = new Map();

// 缓存时效
const cacheExpirationTime = 1000 * 60; // 1分钟

// 手动清空缓存
export function clearCache() {
	cacheMap.clear();
}

// 请求拦截时判断缓存是否存在并在是否在有效期
export function hasCache(config: AxiosCustomRequestConfig) {
	if (config.cache) {
		const key = generateReqKey(config);
		const requestCache = cacheMap.get(key);
		if (requestCache && Date.now() - requestCache.cacheTime < cacheExpirationTime) {
			// return Promise.reject({
			//     cached: true,
			//     key
			// })
			// 创建取消请求实例
			const abortAxios = new AbortAxios();
			abortAxios.removePending(config);
		}
	}
}

// 响应拦截时判断缓存是否存在，不存在则添加缓存
export function setCache(config: AxiosCustomRequestConfig, res: AxiosResponse) {
	if (config.cache) {
		const key = generateReqKey(config);
		if (!cacheMap.has(key)) {
			cacheMap.set(key, { cacheTime: Date.now(), res: cloneDeep(res) });
		} else {
			// 若存在，并且已过期，则更新缓存
			const requestCache = cacheMap.get(key);
			if (Date.now() - requestCache.cacheTime > cacheExpirationTime) {
				cacheMap.set(key, { cacheTime: Date.now(), res: cloneDeep(res) });
			}
		}
	}
}

// 响应reject
export function rejectRequestToCached(err: AxiosCustomError) {
	// @ts-ignore cache
	if (err.config?.cache) {
		//返回缓存
		return Promise.resolve(cloneDeep(cacheMap.get(generateReqKey(err.config))).res);
	}
}
